package com.zxl.grocery.modular.crawler.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author: Lzx
 * @Description:
 * @Date: Created in 15:57 2018/10/31
 * @Modified By:
 */
public class StringUtils {

    /**
     * container是否包含child
     *
     * @param container
     * @param child
     * @return
     */
    public static boolean str1ContainsStr2(String container, String child) {
        if (container.length() < child.length()) {
            return false;
        }
        int maxLength = container.length();
        char first = child.charAt(0);
        int i = -1;
        while (++i < maxLength) {
            // 先找第一个元素是否能找到
            if (first == container.charAt(i)) {
                // 找到第一个元素再去匹配后面的元素
                if (matchStr(container.substring(i), child)) {
                    return true;
                }
            }
        }
        return false;
    }

    // max是否包含min
    public static boolean matchStr(String max, String min) {
        if (max.length() < min.length()) {
            return false;
        }
        int i = -1;
        int minLength = min.length();
        while (++i < minLength) {
            // 对应位置的元素是否都相等
            if (min.charAt(i) != max.charAt(i)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 使用正则表达式获取文本的章节名称
     * 获取文本的章节，首先要确定章节的开始标准，一般中文的章节都是以“第”开头，第一章、第二章等。所以使用“^”字符来确定首位，但是很多时候章节前面会有空白字符，所有以“第”作为章节的开始，进行以下的匹配^\\s*第
     * “\s”表示空白字符，加上“*”表示0到多个空白字符，“^”表示是以空白字符加上“第作为开始的”。如果需要匹配的字符串不是在段落的开始，把“^”去掉即可。
     * 章节的序号格式不统一，有可能是阿拉伯数字，也有可能是中文，长度一般不会超过9位，所以以任意字符来匹配
     * .{1,9}“.”表示任意字符，“{1,9}”表示长度最小1次，最大9次。
     * 章节序号后面是修饰 [章节卷集部篇回]
     * “[]” 表示里面的字符有一个出现了，“[]”匹配单字符，相当于 “章”或“节”或“卷”或“集”或“部”或“篇”或“回” 出现了。
     * 在标题前面一般有空白字符，也有可能没有所以添加空白字符的匹配 \\s*
     * 章节标题可以是任意字符，任意字符是“.”，0到多个任意字符就是  .*
     * 一般章节过后就是换行，所以最后要有换行的匹配\n|\r|\r\n
     * 将上面的所有正则组合成一个就是(^\\s*第)(.{1,9})[章节卷集部篇回](\\s*)(.*)(\n|\r|\r\n)
     * 这个正则表达式中一个有个6个group，整个表达式是第一个group，每个“()”里面的就是一个group，[章节卷集部篇回]是一个group，完成了正则表达式，我们就可以用Java获取段落的章节标题了。
     * public class TestRegex {
     * <p>
     * <p>
     * public static void main(String[] args) {
     * String testString = "第一回 风雪惊变\r\n  钱塘江浩浩江水，日日夜夜无穷无休的从临安牛家村边绕过，东流入海。";
     * Pattern p = Pattern.compile("(^\\s*第)(.{1,9})[章节卷集部篇回](\\s*)(.*)(\n|\r|\r\n)");
     * Matcher matcher = p.matcher(testString);
     * while (matcher.find()) {
     * for (int i = 0; i <= matcher.groupCount(); i++) {
     * System.out.println("group" + i + " : " + matcher.start(i) + " - " + matcher.end(i));
     * System.out.println(matcher.group(i));
     * }
     * }
     * }
     * }
     *
     * @param chapter
     * @return 这里只需要获取章节数并转化为阿拉伯数字即可
     */
    public static Integer getChapterSort(String chapter) {
        Integer chapter_sort = null;
        Pattern p = Pattern.compile("(^\\s*第)(.{1,9})[章节卷集部篇回](\\s*)(.*)");
        Matcher matcher = p.matcher(chapter);
        while (matcher.find()) {
            for (int i = 0; i <= matcher.groupCount(); i++) {
                //System.out.println("group" + i + " : " + matcher.start(i) + " - " + matcher.end(i));
                if (matcher.group(i) != null && NumberUtils.isDigit(matcher.group(i))) {
                    return Integer.valueOf(matcher.group(i));
                }
                if (matcher.group(i) != null && NumberUtils.isBigDigit(matcher.group(i))) {
                    return Integer.valueOf(NumberUtils.NumZHToALB(matcher.group(i)));
                }
            }
        }
        if (chapter != null) {
            if (NumberUtils.getNumbers(chapter) != null) {
                chapter_sort = NumberUtils.getNumbers(chapter);
            } else if (NumberUtils.getStrArab(chapter) != null) {
                chapter_sort = NumberUtils.getStrArab(chapter);
            }
        }
        return chapter_sort;
    }

}
